package com.buba.system.controller;

import com.buba.system.pojo.Employee;
import com.buba.system.pojo.Job;
import com.buba.system.pojo.Menu;
import com.buba.system.pojo.SystemUser;
import com.buba.system.service.EmployeeService;
import com.buba.system.service.JobService;
import com.buba.system.service.LoginService;
import com.buba.system.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 登录  一个员工会有账号信息和多个职位，而一个职位拥有多个菜单权限
 */
@RestController
@RequestMapping("/LoginController")
public class LoginController {
    private LoginService loginService;//登录
    private EmployeeService employeeService;//员工
    private JobService jobService;//职位
    private MenuService menuService;//菜单

    /**
     *
     * @param systemUser
     * @param session 一次会话
     *  session就是像一个临时的容器来存放这些临时的东西，从登陆开始就保存在session里，
     * 为避免后面进行修改，所以不能直接存入数据库
     * @return
     */
    @RequestMapping("/login")
    public Map<String,Object> login(SystemUser systemUser, HttpSession session){
        Map<String,Object> map = new HashMap<>();
        //查询用户的登录信息并放入账号密码对象
        SystemUser loginUser = loginService.login(systemUser);
        if(loginUser == null){
            map.put("message","账号或密码错误");
            return map;
        }else{
            //查询该用户拥有的菜单权限，以及个人信息
            //根据登录成功账号的员工外键，查询该员工的所有信息
            Employee employee = employeeService.selEmployee(loginUser.getEmployeeId());
            //再把账号信息也存到SystemUser对象
            employee.setSystemUser(loginUser);
            //根据员工id查询职位（员工职位中间表）
            List<Job> jobList = jobService.selJob(employee.getEmployeeId());

            //根据职位id查询拥有的菜单   用增强for循环遍历所有职位
            for(Job job : jobList){
                //根据职位id查询该职位所拥有的所有菜单信息
                List<Menu> menuList = menuService.selMenu(job.getJobId());
                //把查询到的菜单信息装入job对象
                job.setMenuList(menuList);
            }
            //如何使用VUE展示层级菜单，当一个员工出现多个职位，如何解决菜单重复问题
            //如何使用vue展示层级菜单（给vue的data就是层级data）
            //根据职位列表获取该用户所拥有的菜单集（去重复菜单、获得菜单的层级效果）
            List<Menu> menuList = menuService.noDup(jobList);
            //最后把得到的职位信息和所对应的菜单信息全部存到员工employee
            employee.setJobList(jobList);
            employee.setMenuList(menuList);
            //把员工所有的信息再保存到session
            session.setAttribute("employee",employee);
            map.put("message","成功");
        }
        return map;
    }


    @Autowired
    public void setMenuService(MenuService menuService) {
        this.menuService = menuService;
    }

    @Autowired
    public void setJobService(JobService jobService) {
        this.jobService = jobService;
    }

    @Autowired
    public void setEmployeeService(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @Autowired
    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }
}
